package it.traveldream.EJB;

import it.traveldream.EJB.DTO.GiftListDTO;
import it.traveldream.EJB.entities.GiftList;
import it.traveldream.utility.DTO2Entities;

import java.util.ArrayList;
import java.util.Iterator;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * Session Bean implementation class GiftBeanImpl
 */
@Stateless
public class GiftBeanImpl implements GiftBean {

	/**
	 *  constructor. 
	 */
	public GiftBeanImpl() {





	}

	@PersistenceContext

	EntityManager em;

	/**
	 * aggiunge alla tabella del db GiftList  un arraylist di GiftList(quelli di un determinato pacchetto) 
	 */
	@Override
	@RolesAllowed({"USERS"})
	public void addToGiftListEjb(ArrayList<GiftListDTO> gift2add) throws Exception{

		GiftList help = new GiftList();
		GiftListDTO el = new GiftListDTO();
		Iterator<GiftListDTO> iterG = gift2add.iterator();
		UtenteEJBImpl us = new UtenteEJBImpl(em);


		if (!isAlreadyInGL(help)){

			while(iterG.hasNext()){

				el = iterG.next();

				System.out.println("ho passato : "+el.getUsernameUtente());


				help = DTO2Entities.convertGiftListDTO(el,em);
				/*
    		help.setAcquistato(el.getAcquistato());
    		help.setAcquistatoDa(el.getAcquistatoDa());
    		help.setIdServizioBase(el.getIdServizioBase());
    		help.setIdUtente(us.getIdFromUsername(el.getUsernameUtente().trim()));
    		help.setPacchetti(DTO2Entities.convertPacchettoDTO(el.getPacchetto()));
    		help.setTipo_servizioBase(el.getTipo_servizio_base());
				 */
				// result CONTIENE LE TUPLE DA INSERIRE NEL DB NELLA TABELLA GiftList


				System.out.println("DATI:idpacchetto: "+help.getPacchetti().getIdPacchetto()+" idservbase: "+help.getIdServizioBase()+" tiposervbase: "+help.getTipo_servizioBase());
				try{
					em.createNativeQuery("INSERT INTO gift_list (id_pacchetto,id_utente,id_servizio_base,acquistato,acquistato_da,tipo_servBase) VALUES "
							+ "("+help.getPacchetti().getIdPacchetto()+","+help.getIdUtente()+","+help.getIdServizioBase()+",0,NULL,"
							+ help.getTipo_servizioBase()+")").executeUpdate();
					//em.persist(entity);
				}catch(Exception e){

					throw new Exception("ERRORE INSERIMENTO ELEMENTO GIFT LIST: "+e.getMessage());


				}
				
				// AGGIORNO DISPONIBILITA PACCHETTO
				try{
					int rows = em.createQuery("UPDATE Pacchetti p SET p.disponibilita = :par WHERE p.idPacchetto= :idpack").setParameter("par", ((help.getPacchetti().getDisponibilita())-1))
							.setParameter("idpack", help.getPacchetti().getIdPacchetto()).executeUpdate();
					if(rows!=1){
						throw new Exception("AGGIORNATE "+rows+" TUPLE ANZICHE' UNA");
					}
				}catch(Exception e){
					throw new Exception("ERRORE AGGIORNAMENTO DISPONIBILITA PACCHETTO: "+e.getMessage());
				}

			}

		}else{

			throw new Exception("PACCHETTO GIA' INSERITO NELLA GIFTLIST");

		}

	}

	/**
	 * @param ver-entità di verifica
	 * @return-se il pacchetto è già stato inserito nella giftlist
	 */
	public boolean isAlreadyInGL(GiftList ver){

		return !em.createQuery("SELECT  g from GiftList g where g.pacchetti = :par1 and g.idUtente = " + ver.getIdUtente()).setParameter("par1", ver.getPacchetti()).getResultList().isEmpty();

	}

	/**
	 * @param el -elemento della giftlist da aggiornare
	 */
	@Override
	@RolesAllowed({"USERS"})
	public void UpdateGiftList(GiftListDTO el){

		GiftList help = new GiftList();
		UtenteEJBImpl us = new UtenteEJBImpl();

		help.setAcquistato(el.getAcquistato());
		help.setAcquistatoDa(el.getAcquistatoDa());
		help.setIdServizioBase(el.getIdServizioBase());
		help.setIdUtente(us.getIdFromUsername(el.getUsernameUtente()));
		help.setPacchetti(DTO2Entities.convertPacchettoDTO(el.getPacchetto()));
		help.setTipo_servizioBase(el.getTipo_servizio_base());

		em.persist(help);

	}
	
	@Override
	public void updateGL(GiftListDTO gldto) throws Exception{
		// AGGIORNA UNA GIFTLIST CON IL MERGE
		GiftList entity=DTO2Entities.convertGiftListDTO(gldto, em);
		
		try{
			entity=em.merge(entity);
			em.flush();
		}catch(Exception e){
			throw new Exception("ERRORE AGGIORNAMENTO GIFT LIST: "+e.getMessage());
		}
		
		// UPDATE DISPONIBILITA PACCHETTO
		/*try{
			int rows = em.createQuery("UPDATE Pacchetti p SET p.disponibilita="+entity.getPacchetti().getDisponibilita()+" "
					+ "WHERE p.idPacchetto="+entity.getPacchetti().getIdPacchetto()).executeUpdate();
			if(rows!=1){
				throw new Exception("ZIO CANE, "+rows+" TUPLE INVECE CHE UNA");
			}
		}catch(Exception e){
			throw new Exception("ERRORE AGGIORNAMENTO DISPONIBILITA: "+e.getMessage());
		}
		*/
	}
	
	public void updateGLWithJPQL(GiftListDTO gldto)throws Exception{
		// AGGIORNA UNA GIFTLIST CON UNA QUERY JPQL
		GiftList entity = DTO2Entities.convertGiftListDTO(gldto, em);
		String help = new String();
		
		if(entity.getAcquistatoDa()==null){
			help="NULL";
		}else{
			help=entity.getAcquistatoDa();
		}
		
		try{
			int rows = em.createQuery("UPDATE GiftList g SET g.acquistato= :par1, g.acquistatoDa= :par2, g.idServizioBase= :par3, "
					+ "g.idUtente= :par4, g.tipo_servizioBase= :par5, g.pacchetti= :par6 WHERE g.idElemento= :par7").setParameter("par1", entity.getAcquistato()).setParameter("par2", help)
					.setParameter("par3", entity.getIdServizioBase()).setParameter("par4", entity.getIdUtente()).setParameter("par5", entity.getTipo_servizioBase())
					.setParameter("par6", entity.getPacchetti()).setParameter("par7", entity.getIdElemento()).executeUpdate();
			if(rows!=1){
				throw new Exception("AGGIORNATE "+rows+" TUPLE INVECE CHE UNA ZIO CANE");
			}
		}catch(Exception e){
			throw new Exception("ERRORE AGGIORNAMENTO GIFT LIST: "+e.getMessage());
		}
		
		// UPDATE DISPONIBILITA PACCHETTO
		/*try{
			int rows = em.createQuery("UPDATE Pacchetti p SET p.disponibilita="+entity.getPacchetti().getDisponibilita()+" "
					+ "WHERE p.idPacchetto="+entity.getPacchetti().getIdPacchetto()).executeUpdate();
			if(rows!=1){
				throw new Exception("ZIO CANE, "+rows+" TUPLE INVECE CHE UNA");
			}
		}catch(Exception e){
			throw new Exception("ERRORE AGGIORNAMENTO DISPONIBILITA: "+e.getMessage());
		}*/
		
	}


}
